﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using InterfazGrafico.LibreriaClases.Clases;
using InterfazGrafico.LibreriaConstantes;
using InterfazGrafico.LibreriaConstantes.Elementos;

namespace InterfazGrafico.LibreriaClases.Propiedades
{
    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class PBDModificar : Propiedades
    {
        /// <summary>
        /// Entrada de datos.
        /// </summary>
        public string Entrada
        {
            get
            {
                return this.getPropiedadString(CBDModificar.Entrada);
            }
            set
            {
                this.setOrAddPropiedad(CBDModificar.Entrada, value);
            }
        }

        /// <summary>
        /// Estructura de entrada.
        /// </summary>
        public string EstructuraEntrada
        {
            get
            {
                return this.getPropiedadString(CBDModificar.EstructuraEntrada);
            }
            set
            {
                this.setOrAddPropiedad(CBDModificar.EstructuraEntrada, value);
            }
        }

        /// <summary>
        /// Tipo de base de datos.
        /// </summary>
        public TipoBaseDatos TipoBD
        {
            get
            {
                return ConversionesTipoBaseDatos.ToTipoBD(this.getPropiedadString(CBDModificar.TipoBD));
            }
            set
            {
                this.setOrAddPropiedad(CBDModificar.TipoBD, ConversionesTipoBaseDatos.ToString(value));
            }
        }

        /// <summary>
        /// Cadena de conexión a la base de datos.
        /// </summary>
        public string CadenaConexion
        {
            get
            {
                return this.getPropiedadString(CBDModificar.CadenaConexion);
            }
            set
            {
                this.setOrAddPropiedad(CBDModificar.CadenaConexion, value);
            }
        }

        /// <summary>
        /// Sentencia a ejecutar sobre la tabla.
        /// </summary>
        public string Sentencia
        {
            get
            {
                return this.getPropiedadString(CBDModificar.Sentencia);
            }
            set
            {
                this.setOrAddPropiedad(CBDModificar.Sentencia, value);
            }
        }

        /// <summary>
        /// Frecuencia del commit.
        /// </summary>
        public long Commit
        {
            get
            {
                long? dato = this.getPropiedadLong(CBDModificar.FrecuenciaCommit);
                if (!dato.HasValue)
                    return 0;
                return dato.Value;
            }
            set
            {
                this.setOrAddPropiedad(CBDModificar.FrecuenciaCommit, value);
            }
        }
        
        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public PBDModificar()
            : base()
        {
        }

        /// <summary>
        /// Obtiene los parámetros a partir del fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        override public void leer(string fichero)
        {
            base.leer(fichero);
            XmlDocument xml = LeerXml.AbrirFicheroParametros(fichero);
            try
            { this.Entrada = LeerXml.ObtenerValorCampo(xml, CBDModificar.RutaEntrada); }
            catch (Exception)
            { this.Entrada = string.Empty; }
            
            try
            { this.EstructuraEntrada = LeerXml.ObtenerValorCampo(xml, CBDModificar.RutaEstructuraEntrada); }
            catch (Exception)
            { this.EstructuraEntrada = string.Empty; }

            // Configuración
            try
            { this.TipoBD = ConversionesTipoBaseDatos.ToTipoBD(LeerXml.ObtenerValorCampo(xml, CBDModificar.RutaTipoBD)); }
            catch (Exception)
            { this.TipoBD = TipoBaseDatos.ODBC; }

            try
            { this.CadenaConexion = LeerXml.ObtenerValorCampo(xml, CBDModificar.RutaCadenaConexion); }
            catch (Exception)
            { this.CadenaConexion = string.Empty; }

            try
            { this.Sentencia = LeerXml.ObtenerValorCampo(xml, CBDModificar.RutaSentencia); }
            catch (Exception)
            { this.Sentencia = string.Empty; }

            try
            { this.Commit = long.Parse(LeerXml.ObtenerValorCampo(xml, CBDModificar.RutaFrecuenciaCommit)); }
            catch (Exception)
            { this.Commit = 0; }
        }

        /// <summary>
        /// Escribe los parámetros al fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        public override void escribir(string fichero)
        {
            try
            {
                base.escribir(fichero);
                XmlWriter xml = EscribirXml.AbrirFicheroParametros(fichero);
                EscribirXml.InicioElemento(xml, CBDModificar.NodoRaiz);
                EscribirXml.EscribeNodo(xml, CBDModificar.NodoEntrada, Entrada);
                EscribirXml.EscribeNodo(xml, CBDModificar.NodoEstructuraEntrada, EstructuraEntrada);
                // Configuración
                EscribirXml.InicioElemento(xml, CBDModificar.NodoConfiguracion);
                EscribirXml.EscribeNodo(xml, CBDModificar.NodoTipoBD, ConversionesTipoBaseDatos.ToString(TipoBD));
                EscribirXml.EscribeNodo(xml, CBDModificar.NodoCadenaConexion, CadenaConexion);
                EscribirXml.EscribeNodo(xml, CBDModificar.NodoFrecuenciaCommit, Commit.ToString());
                EscribirXml.EscribeNodo(xml, CBDModificar.NodoSentencia, Sentencia);
                EscribirXml.FinElemento(xml);
                EscribirXml.FinElemento(xml);
                EscribirXml.Flush(xml);
                EscribirXml.Close(xml);
            }
            catch (Exception ex)
            {
                throw new ApplicationException(Constantes.ERROR_ESCRITURA_FICHERO_CONFIGURACION, ex);
            }
        }
    }
}
 